package com.czuft.usersystem.filter;

import com.czuft.usersystem.pojo.User;
import com.czuft.usersystem.service.UserService;
//import IPUtils;
import com.czuft.usersystem.util.TokenUtil;
import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//import java.text.SimpleDateFormat;
//import java.util.Date;
//import java.util.Enumeration;
import java.util.List;
import java.util.Map;

@Slf4j
@Component
public class AuthHandlerInterceptor implements HandlerInterceptor {
    @Resource
    TokenUtil tokenUtil;
    @Resource
    private UserService userService;
//    @Value("${token.privateKey}")
//    private String privateKey;
    @Value("${token.yangToken}")
    private Long yangToken;
    @Value("${token.oldToken}")
    private Long oldToken;

       /**
     * 权限认证的拦截操作.
     */
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest,
                             HttpServletResponse httpServletResponse,
                             Object object) throws Exception {

//        //IP
//        String ip = IPUtils.getIpAddr(httpServletRequest);
//        //考虑到如果对方是爬虫的可能，那么请求也许会很多，手动加分割线区分每次请求，后头看日志可以直观些
//        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
//        String ttime = df.format(new Date());// new Date()为获取当前系统时间
//
//        System.out.println("[" + df.format(new Date()) + "]: ┌" + "──────────────────────────────────────────────────────────────────────────────────────────────");
//        System.out.println("[" + ttime + "]: │" + "IP: " + ip);
//        System.out.println("[" + ttime + "]: │" + "URI: " + httpServletRequest.getRequestURI());     // /index/getAll
//        System.out.println("[" + ttime + "]: │" + "Method: " + httpServletRequest.getMethod());      //GET
//        System.out.println("[" + ttime + "]: │" + "CharacterEncoding: " + httpServletRequest.getCharacterEncoding());    //UTF-8
//        System.out.println("[" + ttime + "]: │" + "QueryString: " + httpServletRequest.getQueryString());    //请求中的查询条件 相当于请求参数 如: name=abc
//        Enumeration<String> headers = httpServletRequest.getHeaderNames();
//        //Header部分
//        while (headers.hasMoreElements()) {
//            String headerName = headers.nextElement();
//            String header = httpServletRequest.getHeader(headerName);
//            System.out.println("[" + ttime + "]: │-" + headerName + ": " + header);
//        }
//        System.out.println("[" + ttime + "]: └" + "──────────────────────────────────────────────────────────────────────────────────────────────");
//

//
////        回话超时判断
//        String userId = "";
//        if (httpServletRequest.getSession().getAttribute("id") != null) {
//            userId = String.valueOf(httpServletRequest.getSession().getAttribute("id"));
//        }
//        if (userId == null || "".equals(userId)) {
//            log.info("Interceptor：跳转到login页面！");
//            httpServletResponse.sendRedirect("../");
//            return false;
//        }


//        //解决办法就是加上这一行代码，跨域访问允许访问的响应头的内容
        httpServletResponse.setHeader("Access-Control-Expose-Headers", "token");

//        log.info("=======进入拦截器========");
        // 如果不是映射到方法直接通过,可以访问资源.
        if (!(object instanceof HandlerMethod)) {
            return true;
        }

        //为空就返回错误
        String token = httpServletRequest.getHeader("token");
        if (null == token || "null".equals(token) || "".equals(token.trim())) {
            // 执行认证
            httpServletResponse.sendRedirect("../");
            return false;
//            throw new RuntimeException("无token，请重新登录");
//            return false;
        }
        log.info("==============token:" + token);

        // 获取 token

        Map<String, String> map = tokenUtil.parseToken(token);
//        String userId = map.get("userId");
//        String userRole = map.get("userRole");
        String name = map.get("name");
        long timeOfUse = System.currentTimeMillis() - Long.parseLong(map.get("timeStamp"));

        //1.判断 token 是否过期
        //年轻 token
        if (timeOfUse < yangToken) {
//            log.info("年轻 token");
            httpServletResponse.setHeader("token", token);
        }
        //老年 token 就刷新 token  ------
        // yangToken = 1000000 oldToken =3000000000  timeOfUse >= yangToken && timeOfUse < oldToken
        else if (timeOfUse < oldToken) {
//            httpServletResponse.setHeader("token",tokenUtil.getToken(userId,userRole));
            httpServletResponse.setHeader("token", tokenUtil.getToken(name));
        }
        //过期 token 就返回 token 无效.
        else {
            //            log.info("Interceptor：跳转到login页面！");
            httpServletResponse.sendRedirect("../");
            return false;
//            throw new TokenAuthExpiredException();

        }
// 2,用户存在判断
        User user = new User();
        user.setName(name);
        List<User> list = null;
        if (user.getName() != null && !user.getName().equals("")) {
            list = userService.getUserlistByName(user);
        }
        if (list == null) {
            throw new RuntimeException("用户不存在，请重新登录");
        }
//        //3.角色匹配.
//        if ("user".equals(userRole)) {
//            log.info("========user账户============");
//            return true;
//        }
//        if ("admin".equals(userRole)) {
//            log.info("========admin账户============");
//            return true;
//        }
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest httpServletRequest,
                           HttpServletResponse httpServletResponse,
                           Object o, ModelAndView modelAndView) {

////        控制器执行完毕后，改写ModelAndView
//        String fcode = "";
//        fcode = httpServletRequest.getParameter("fcode");
//        HttpSession session = httpServletRequest.getSession();
//        setmodel(fcode, modelAndView, session, httpServletResponse);
    }

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest,
                                HttpServletResponse httpServletResponse,
                                Object o, Exception e){
    }

//    //    共通设置Model 主要是左侧菜单等。。。
//    private void setmodel(@RequestParam("fcode") String fcode, ModelAndView modelAndView,
//                          HttpSession session, HttpServletResponse httpServletResponse) throws IOException {
//
//        if (modelAndView != null) {
//            User u = (User) session.getAttribute("user");
//            if (u == null) {
//                log.info("Interceptor：跳转到login页面！");
//                httpServletResponse.sendRedirect("../");
//                return;
//            }
////          重新加載用戶自選基金和，基金詳細信息。
//            u = userService.queryFoundationAndDetailByUserName(u.getName());
//            session.setAttribute("user", u);
//            List<Foundation> myfoundationlist = u.getFoundationList();
//            modelAndView.addObject("myfoundationlist", myfoundationlist);
//
//
//            Foundation foundation = foundationService.getFoundationByCode(fcode, u.getName());
//
//            // 默认向前推三年
//            Date dNow = new Date();   //当前时间
//
//            Date dBefore = new Date();
//
//            Calendar calendar = Calendar.getInstance(); //得到日历
//
//            calendar.setTime(dNow);//把当前时间赋给日历
//
//            calendar.add(Calendar.YEAR, -3);  //设置为三年前
//
//            dBefore = calendar.getTime();   //设置为三年前
//
//            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); //设置时间格式
//
//            String defaultStartDate = sdf.format(dBefore);    //格式化设置为三年前的天
//
//            String defaultEndDate = sdf.format(dNow); //格式化当前时间
//
//            String startDate = defaultStartDate;
//            String endDate = defaultEndDate;
//
//            if (myfoundationlist != null && myfoundationlist.size() > 0) {
////                开始日期为所欲基金的最最後日期中的 最小一個、、 否者就是是系统日期往前推三年
//                String tempdate = "";
//                for (Foundation fd : myfoundationlist
//                ) {
//                    // 取我的基金纖細-》 最後日期中的 -》最小一個日期
//                    if (fd.getFoundationDetailList() != null
//                            && fd.getFoundationDetailList().size() > 0) {
//
//                        if (tempdate.equals("")) {
//                            if (fd.getFoundationDetailList().get(0) != null && fd.getFoundationDetailList().get(0).getFsrq() != null) {
//                                tempdate = fd.getFoundationDetailList().get(0).getFsrq();
//                            } else {
//                                tempdate = defaultStartDate;
//                                break;
//                            }
//                        } else if (tempdate.compareTo(fd.getFoundationDetailList().get(0).getFsrq()) > 0) {
//                            tempdate = fd.getFoundationDetailList().get(0).getFsrq();
//                        }
//
//                    } else {
//                        tempdate = defaultStartDate;
//                        break;
//                    }
//
//
//                }
//                startDate = tempdate;
//            }
////            基金标题
//            if (foundation != null) {
//                modelAndView.addObject("fcode", foundation.getFcode());
//                modelAndView.addObject("fname", foundation.getFname());
//
//            } else {
//                modelAndView.addObject("fcode", "");
//                modelAndView.addObject("fname", "");
//            }
//            modelAndView.addObject("startDate", startDate);
//            modelAndView.addObject("endDate", endDate);
//        }
//    }

}